package com.empsys.filter;

import com.alibaba.fastjson.JSON;
import com.empsys.pojo.Result;
import com.empsys.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author wzm
 * @create 2023-12-13 14:22
 * project_name:web2310
 * @Description
 */
//检查令牌判断未登录的过滤器（登录校验）
/*@WebFilter(urlPatterns = "/*") *///配置过滤器要拦截的路径 /* 所有请求
@Slf4j
public class LoginCheckFilter implements Filter {
    //过滤器拦截请求的方法
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {

        //将父类对象强转位子类对象就可以调用子类特殊的方法
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        
        //1.获取请求路径
        String url = request.getRequestURL().toString();
        log.info("请求url,{}",url);

        //2.判断请求地址中是否有login,如果有就放行
        if(url.contains("/login")){
            chain.doFilter(request,response);//放行
            return;//不再执行
        }

        //3.不是login 获取请求头中携带的token
        String token = request.getHeader("Token");
        log.info("token:{}",token);

        //4.判断token是否存在，不存在返回错误结果（未登录）
        if(!StringUtils.hasLength(token)){ //return (str != null && !str.isEmpty());
            log.info("token不存在或为null");

            Result result = Result.error("NOT_LOGIN");//java对象 响应数据
            //java对象转为json字符串
            String json = JSON.toJSONString(result);

            //servlet方法响应错误信息到前端
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(json);

            return;//结束
        }

        //5.如果token存在 就解析验证token是否正确或有效  （正确放行  无效返回错误）
        try {
            JwtUtils.parseJwt(token);
        }catch (Exception e){//出现了解析异常
            log.info("令牌解析出现了异常");
            Result result = Result.error("NOT_LOGIN");//java对象 响应数据
            //java对象转为json字符串
            String json = JSON.toJSONString(result);

            //servlet方法响应错误信息到前端
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(json);

            return;//结束
        }

        //通过 放行  令牌合法
        chain.doFilter(request,response);


    }
}
